// ============================== 导入依赖 ============================== //

import CORE from '@/CORE'
import mixPath from '../mixPath'
import mixForm from '../form/mixForm'
import FormInput from '../form/FormInput'

// ============================== 导出混合 ============================== //

export default {
  /**
   * 混入列表 (配置选项合并)
   */
  mixins: [mixPath],

  /**
   * 属性注册 (抽取以便查阅)
   */
  props: CORE.WEB.RowCommon,

  /**
   * 计算属性 (慎用箭头函数)
   */
  computed: {
    /**
     * 绑定列表
     */
    bindList: mixForm.computed.bindList,

    /**
     * 是否为多个绑定
     */
    isMulti: mixForm.computed.isMulti,

    /**
     * 属性名称
     */
    prop: mixForm.computed.prop,

    /**
     * 是否有前缀
     */
    hasPrefix: FormInput.computed.hasPrefix,

    /**
     * 是否有后缀
     */
    hasSuffix: FormInput.computed.hasSuffix,

    /**
     * 父级的 Web 组件
     */
    parentWeb() {
      return CORE.componentParent(this, 'WebTable') || { $props: {} }
    },

    /**
     * 模块路径
     */
    path() {
      const { parentWeb } = this
      return parentWeb.$props.path || ''
    },

    /**
     * 内容样式类
     */
    divClass() {
      const { className, diyClass } = this
      const diyStr = diyClass ? ` ${diyClass}` : ''
      return `CoreWeb-RowContent ${className}${diyStr}`
    },

    /**
     * 对齐方式
     */
    align() {
      if (this.left) return 'left'
      if (this.right) return 'right'
      return 'center'
    },

    /**
     * 固定方式
     */
    fixed() {
      if (this.fixLeft) return 'left'
      if (this.fixRight) return 'right'
      return null
    },

    /**
     * 排序方式
     */
    sortable() {
      if (this.sort) return 'custom'
      return false
    },

    /**
     * 表格列配置
     */
    tableColumn() {
      const { elProps, label, prop, isMulti, width, minWidth, align, fixed, sortable, multi, noTip } = this
      return {
        ...elProps,
        key: this.$options.name,
        label,
        prop: isMulti ? null : prop,
        width,
        minWidth,
        align,
        fixed,
        sortable,
        showOverflowTooltip: noTip ? false : !multi,
        className: noTip && !multi ? 'CoreWeb-Row-no-tip' : null,
      }
    },
  },

  /**
   * 本地方法 (轻量重要在前)
   */
  methods: {
    /**
     * 获取绑定值
     */
    getValue(row, bind) {
      const keys = CORE.isString(bind) ? bind.replace(/\[(\d+)\]/g, '.$1').split('.') : [bind]
      const value = keys.reduce((data, key) => CORE.isJSON(data) || CORE.isArray(data) ? data[key] : null, row)
      return value
    },

    /**
     * 转换
     */
    trans(value) {
      return value
    },

    /**
     * 获取文本
     */
    getText(row) {
      const { bind, trans, getValue, diyTrans } = this
      const text = trans(getValue(row, bind))
      return diyTrans ? diyTrans(row, bind, text) : text
    },
  },
}
